﻿using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleInOutControl.Common
{
    /// <summary> 
    /// JSON帮助类 
    /// </summary> 
    public static class JsonHelper
    {
        /// <summary>
        /// 对象转Json
        /// </summary>
        /// <param name="obj">对象</param>
        /// <param name="IgnoreNull">是否忽略空值</param>
        /// <param name="FormatHtml">是否格式化</param>
        /// <returns>JSON格式的字符串</returns>
        public static string ToJson(this object obj, bool IgnoreNull = false, bool FormatHtml = false)
        {
            string dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
            JsonSerializerSettings jsonSetting = new JsonSerializerSettings { NullValueHandling = IgnoreNull ? NullValueHandling.Ignore : NullValueHandling.Include };
            if (obj == null)
            {
                return null;
            }
            Formatting formatting = FormatHtml ? Formatting.Indented : Formatting.None;
            jsonSetting.DateFormatString = dateTimeFormat;

            return JsonConvert.SerializeObject(obj, formatting, jsonSetting);
        }

        /// <summary>
        /// Json转对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="result"></param>
        /// <returns></returns>
        public static T ToObject<T>(this string json)
        {
            try
            {
                return JsonConvert.DeserializeObject<T>(json);
            }
            catch (Exception)
            {
                return default;
            }
        }

        ///// <summary> 
        ///// 数据表转键值对集合 www.2cto.com  
        ///// 把DataTable转成 List集合, 存每一行 
        ///// 集合中放的是键值对字典,存每一列 
        ///// </summary> 
        ///// <param name="dt">数据表</param> 
        ///// <returns>哈希表数组</returns> 
        //public static List<Dictionary<string, object>> DataTableToList(DataTable dt)
        //{
        //    List<Dictionary<string, object>> list
        //         = new List<Dictionary<string, object>>();

        //    foreach (DataRow dr in dt.Rows)
        //    {
        //        Dictionary<string, object> dic = new Dictionary<string, object>();
        //        foreach (DataColumn dc in dt.Columns)
        //        {
        //            dic.Add(dc.ColumnName, dr[dc.ColumnName]);
        //        }
        //        list.Add(dic);
        //    }
        //    return list;
        //}

        ///// <summary> 
        ///// 数据集转键值对数组字典 
        ///// </summary> 
        ///// <param name="dataSet">数据集</param> 
        ///// <returns>键值对数组字典</returns> 
        //public static Dictionary<string, List<Dictionary<string, object>>> DataSetToDic(DataSet ds)
        //{
        //    Dictionary<string, List<Dictionary<string, object>>> result = new Dictionary<string, List<Dictionary<string, object>>>();

        //    foreach (DataTable dt in ds.Tables)
        //        result.Add(dt.TableName, DataTableToList(dt));

        //    return result;
        //}

        ///// <summary> 
        ///// 数据表转JSON 
        ///// </summary> 
        ///// <param name="dataTable">数据表</param> 
        ///// <returns>JSON字符串</returns> 
        //public static string DataTableToJSON(DataTable dt)
        //{
        //    return ObjectToJson(DataTableToList(dt));
        //}

        ///// <summary> 
        ///// JSON文本转对象,泛型方法 
        ///// </summary> 
        ///// <typeparam name="T">类型</typeparam> 
        ///// <param name="jsonText">JSON文本</param> 
        ///// <returns>指定类型的对象</returns> 
        //public static T JsonToObject<T>(string jsonText)
        //{
        //    JavaScriptSerializer jss = new JavaScriptSerializer();
        //    try
        //    {
        //        return jss.Deserialize<T>(jsonText);
        //    }
        //    catch (Exception ex)
        //    {
        //        throw new Exception("JSONHelper.JSONToObject(): " + ex.Message);
        //    }
        //}

        ///// <summary> 
        ///// 将JSON文本转换为数据表数据 
        ///// </summary> 
        ///// <param name="jsonText">JSON文本</param> 
        ///// <returns>数据表字典</returns> 
        //public static Dictionary<string, List<Dictionary<string, object>>> TablesDataFromJson(string jsonText)
        //{
        //    return JsonToObject<Dictionary<string, List<Dictionary<string, object>>>>(jsonText);
        //}

        ///// <summary> 
        ///// 将JSON文本转换成数据行 
        ///// </summary> 
        ///// <param name="jsonText">JSON文本</param> 
        ///// <returns>数据行的字典</returns> 
        //public static Dictionary<string, object> DataRowFromJson(string jsonText)
        //{
        //    return JsonToObject<Dictionary<string, object>>(jsonText);
        //}
    }
}
